In [1]:
import numpy as np
import matplotlib.pyplot as plt
In [2]:
plt.figure() # Create and empty figure
plt.scatter(range(3),range(3)) # One plot
plt.show()
In [3]:
x = np.linspace(0,5,10) # Esto crea un array de NumPy
y = x**2 # Esto crea otro array con los cuadrados
plt.figure() # Esto crea una figura vacía
plt.scatter(x,y) # Invocar este comando para producir una gráfica de dispersión
plt.xlabel("Eje x") # Para cambiar el rótulo del eje x
plt.ylabel("Eje y") # Para cambiar el rótulo del eje y
plt.title(u"Una sencila gráfica de dispersión") # Para poner acentos poner antes u
plt.savefig("thefig.pdf") # Para guardar en disco la gráfica resultante
plt.savefig("thefig.png", dpi=400) # La extensión determina el formato de exportación
plt.savefig("thefig.jpg")
plt.savefig("thefig.svg")
In [4]:
plt.figure()
y = np.linspace(-5,5,10)
plt.plot(y) # Si no se especifican las abscisas Python asume números enteros consecutivos
plt.title(u"")
plt.show()
In [5]:
plt.figure()
x = np.linspace(-5.0,5.0,100)
y = 1./(1.+x**2)
plt.plot(x,y) # Abscisas y ordenadas
plt.title(u"$\lambda$")
plt.show()
In [6]:
# Una vez creada una figura se pueden seguir añadiendo
# gráficas adicionales en los mismos ejes
plt.figure()
plt.plot(range(10),2*np.arange(10))
plt.plot(range(10),3*np.arange(10))
plt.plot(range(10),3*np.arange(10),"o") # grafica solo los puntos sin unirlos con líneas
plt.show()
In [7]:
# Los marcadores pueden tener diferentes formas
plt.figure(figsize=(8,9))
markers = ["o","^","s","+","x","D"]
# o -> circulo
# ^ -> triángulo
# s -> cuadrado
# + -> plus
# x -> cruz
# D -> diamante
k = 0
for i in markers:
puntos = k*np.arange(-10,11)
abscisas = np.arange(-10,11)
plt.plot(abscisas,puntos,i) # Solo los puntos
plt.plot(abscisas,puntos) # Los puntos unidos con líneas
k=k+1
plt.show()
In [8]:
# También las líneas pueden tener diferentes formatos
plt.figure()
tiposl = ["-","--","-.",":"]
k = 1
for i in tiposl:
x = np.linspace(0,1,10)
y = k * np.ones(10)
plt.plot(x,y,i,lw=10)
k = k + 1
plt.ylim(0,5) # Para modificar el rango vertical mostrado
plt.show()
In [9]:
# Ahora cambiemos el tamaño de los marcadores
plt.figure()
k=0
for i in range(10):
x = np.linspace(0,1,10)
y = k * np.ones(10)
plt.plot(x,y,"o",ms=i)
k = k+1
plt.ylim(-0.5,10)
plt.show()
In [10]:
# Ahora veamos como se controla el color
plt.figure()
colores = ["b","c","g","k","m","r","w","y"]
k=0
for color in colores:
x = np.arange(-10,11)
y = k * np.ones(len(x))
plt.plot(x,y,color)
k = k + 1
plt.ylim(-0.5,7.5) # Para modificar el rango vertical mostrado
plt.show()
In [11]:
# Usando ciclos al interior de figure
th=np.linspace(0,2*np.pi,50)
plt.figure()
plt.axis("equal")
plt.axis("off")
for i in range(10):
# Elegir el centro del círculo
exis = 2*np.random.random()-1
ye = 2*np.random.random()-1
radio=np.random.random()
plt.plot(radio*np.cos(th)+exis,radio*np.sin(th)+ye)
plt.show()
In [12]:
# La función axis() controla el comportamiento del rango horizontal
# y vertical.
# Si se quiere cambiar solamente el rango horizontal usar xlim, y ylim
# para el vertical.
plt.figure()
abscisas = np.linspace(0,2*np.pi,100)
ordenadas = np.sin(abscisas)
plt.plot(abscisas, ordenadas,"go")
ordenadas = np.cos(abscisas)
plt.plot(abscisas,ordenadas,"ob")
plt.xlim(0,np.pi)
plt.ylim(-2,2)
plt.show()
In [13]:
# Axis también admite opciones que determinan los rangos
# de acuerdo a diferentes criterios
plt.figure()
abscisas = np.linspace(0,2*np.pi,100)
ordenadas = np.sin(abscisas)
plt.plot(abscisas, ordenadas,"go")
ordenadas = np.cos(abscisas)
plt.plot(abscisas,ordenadas,"ob")
plt.axis("scaled")
plt.show()
In [14]:
# Axis también admite opciones que determinan los rangos
# de acuerdo a diferentes criterios
plt.figure()
abscisas = np.linspace(0,2*np.pi,100)
ordenadas = np.sin(abscisas)
plt.plot(abscisas, ordenadas,"go")
ordenadas = np.cos(abscisas)
plt.plot(abscisas,ordenadas,"ob")
plt.axis("tight")
plt.show()
In [15]:
# La función grid ordena trazar una cuadrícula
plt.figure()
angulos = np.linspace(0,2*np.pi,100)
x = np.cos(2*angulos)
y = np.cos(3*angulos)
plt.plot(x,y,"o",ms=3)
plt.axis("equal")
plt.grid()
plt.show()
In [16]:
# Modificar la cuadrícula con xticks y yticks
plt.figure()
angulos = np.linspace(0,2*np.pi,100)
x = np.cos(angulos)
y = np.sin(angulos)
plt.plot(x,y,"o",ms=3)
plt.axis("scaled")
plt.grid()
plt.xticks(np.arange(-2,3,1.0),("-2","-1","0","1","2", "3"), size=30)#notese el cambio de fontsize
plt.yticks(np.arange(-2,3,0.5),(""))
plt.show()
In [17]:
plt.figure(figsize=(10,5))
plt.angulos = np.linspace(0,2*np.pi,100)
plt.subplot(2,2,1)
plt.plot(angulos,np.sin(angulos))
plt.title("sin")
plt.grid()
plt.subplot(2,2,2)
plt.plot(angulos,np.cos(angulos))
plt.title(u"cos")
plt.subplot(2,2,3)
plt.plot(angulos,np.tan(angulos))
plt.ylim(-2,2)
plt.title(u"tan")
plt.subplot(2,2,4)
plt.plot(angulos,np.cos(angulos)**2)
plt.title(r"$\cos^2$")
plt.subplots_adjust(hspace=.5) # ajustar el espacio horizontal entre ellas
plt.show()
In [18]:
# De izquierda a derecha y de arriba a abajo.
plt.figure(figsize=(10,10))
k = 1
for n in range(1,6):
for d in range(1,6):
plt.subplot(5,5,k)
plt.plot()
plt.text(0,0,"k="+str(k))
plt.axis("off") # esto elimina los ejes
plt.axis("equal")
k = k + 1
plt.show()
In [19]:
# Rosa polar
# http://en.wikipedia.org/wiki/Rose_%28mathematics%29
plt.figure(figsize=(10,10))
k = 1
for n in range(1,6):
for d in range(1,6):
plt.subplot(5,5,k)
kah = n/d
angulos = np.linspace(0,2*d*np.pi,200)
radios = np.sin(kah * angulos)
x = radios * np.cos(angulos)
y = radios * np.sin(angulos)
plt.plot(x,y)
plt.axis("off") # esto elimina los ejes
plt.axis("equal")
k = k + 1
plt.show()
In [20]:
# En cualquier momento se puede poner una expresión en LaTeX,
# debe ser parte de una cadena raw de caracteres (anteceder r)
# y estar entre $
plt.figure()
x = np.linspace(-10,10,100)
y = 1/(1 + x**2)
plt.plot(x,y)
plt.title(r'Title: $ \phi \psi \kappa $',fontsize=25)
plt.xlabel(r'$\beta $',fontsize=25)
plt.ylabel(r'$\upsilon$',fontsize=25)
plt.show()
In [21]:
# Para cambiar el tamaño de la fuente del título
# usar la opción "fontsize",
# misma opción sirve para modificar la fuente usada en los ejes.
# El tamaño puede ser dado como 'large', 'medium' o 'small', o
# como un tamaño numérico.
plt.figure(figsize=(10,5))
k=1
sizes = ['large', 'medium','small']
for i in sizes:
plt.subplot(1,4,k)
plt.plot(range(10))
plt.title(u"el título",fontsize=i)
plt.xlabel("x",fontsize=i)
k = k + 1
plt.subplot(1,4,k)
plt.plot(range(10))
plt.title(u"el título",fontsize=25)
plt.xlabel("x",fontsize=25)
plt.show()
In [22]:
# Es posible fijar el tamaño de todas las fuentes de una sola vez
plt.rc("font",size=15)
plt.figure()
plt.plot(range(10))
plt.title(u"el título")
plt.xlabel("x")
plt.show()
In [23]:
# Cuando se tienen varias gráficas en un mismo lugar
# conviene escribir una leyenda que especifique cual es cual
plt.figure()
x = np.linspace(0,2*np.pi,20)
plt.plot(x,np.sin(x),"or-",label='sin(x)')
plt.plot(x,np.cos(x),"ob-",label='cos(x)')
plt.legend()
plt.axis([0,2*np.pi,-1,1])
plt.show()
In [24]:
# La posición de la leyende puede modificarse con la ayuda
# del parámetro loc
locs = ['best', 'upper right','upper left','lower left','lower right',
'right','center left','lower center','upper center', 'center']
plt.figure(figsize=(15,20)) # fijarse en la opción para cambiar el tamaño de la gráfica, unidad es pulgadas
k = 1
x = np.linspace(0,2*np.pi,100)
y = np.sin(x)
for i in locs:
plt.subplot(5,2,k)
plt.plot(x,np.sin(x),label='$\sin(x)$')
plt.plot(x,np.cos(x),label='$\cos(x)$')
plt.legend(loc=i)
plt.title(i)
k = k + 1
plt.xlim(0,2*np.pi)
plt.subplots_adjust(hspace=.5)
plt.show()
In [25]:
plt.figure()
angulos = np.linspace(0,2*np.pi,100)
x = np.cos(angulos)
y = 0.5*np.sin(angulos)
plt.plot(x,y)
plt.axis("equal"),
plt.text(1.02,0,"afelio",va='center',ha='left')
plt.text(0,0.55,"perihelio",va='center',ha='center')
plt.axis('off')
plt.show()
In [26]:
plt.figure(figsize=(10,6))
x = np.linspace(-3,3,10)
devs = np.array([0.3*(np.random.random()-0.5) for i in range(len(x))])
y = 1/(1+x**2)+devs
plt.errorbar(x,y,yerr=0.3,xerr=0.3,linestyle='None',marker='o',label='Data')
# Usar linestyle = 'None' pare evitar que se unan los puntos con líneas
plt.xlabel('x')
plt.ylabel('y')
superx = np.linspace(-3,3,100)
plt.plot(superx,1/(1+superx**2),label='Lorentzian fit')
plt.axis([-3,3,0,1.2])
plt.legend()
plt.show()
In [27]:
#####################
# Impresora Radical #
#####################
n=9 # Este es el lado de la matriz cuadrada
# Se inicializa toda la matriz con ceros
mat=[[0 for i in range(n)] for j in range(n)]
# Lo siguiente para comenzar en la esquina superior izquierda
i=0
j=0
# Cuatro modos: a la derecha (0), abajo (1), izquierda (2) y arriba (3).
# Si se "choca" contra el borde de la matriz o con un elemento ya
# relleno entonces se cambia de modo.
# Comenzar moviéndose hacia la derecha.
mode=0
for k in range(1,n*n+1):
# Rellenar el elemento actual con el número correspondiente
mat[i][j]=k
# Decidir el modo
if mode == 0:
if j==n-1 or mat[i][j+1]>0:
mode=1
elif mode == 1:
if i==n-1 or mat[i+1][j]>0:
mode=2
elif mode == 2:
if j==0 or mat[i][j-1]>0:
mode=3
elif mode == 3:
if i==0 or mat[i-1][j]>0:
mode=0
# Actuar de acuerdo al modo
if mode == 0:
j+=1
elif mode == 1:
i+=1
elif mode == 2:
j-=1
elif mode == 3:
i-=1
In [102]:
plt.figure(figsize=(10,5))
plt.subplot(1,2,1)
plt.imshow(mat,interpolation="None")
plt.title("Sin interpolación")
plt.subplot(1,2,2)
plt.imshow(mat, interpolation="bilinear")
plt.title("Con interpolación")
plt.show()